Тест. Доверительные интервалы для среднего


In [1]:
import pandas as pd
import numpy as np

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

Для 61 большого города в Англии и Уэльсе известны средняя годовая смертность на 100000 населения (по данным 1958–1964) и концентрация кальция в питьевой воде (в частях на миллион). Чем выше концентрация кальция, тем жёстче вода. Города дополнительно поделены на северные и южные.


In [23]:
water_data = pd.read_table('water.txt')
water_data.info()
water_data.describe()
water_data.head()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 61 entries, 0 to 60
Data columns (total 4 columns):
location     61 non-null object
town         61 non-null object
mortality    61 non-null int64
hardness     61 non-null int64
dtypes: int64(2), object(2)
memory usage: 2.0+ KB
Out[23]:
mortality hardness
count 61.000000 61.000000
mean 1524.147541 47.180328
std 187.668754 38.093966
min 1096.000000 5.000000
25% 1379.000000 14.000000
50% 1555.000000 39.000000
75% 1668.000000 75.000000
max 1987.000000 138.000000
Out[23]:
location town mortality hardness
0 South Bath 1247 105
1 North Birkenhead 1668 17
2 South Birmingham 1466 5
3 North Blackburn 1800 14
4 North Blackpool 1609 18

Постройте 95% доверительный интервал для средней годовой смертности в больших городах. Чему равна его нижняя граница? Округлите ответ до 4 знаков после десятичной точки.


In [12]:
mort_mean = water_data['mortality'].mean()
print('Mean mortality: %f' % mort_mean)


Mean mortality: 1524.147541

In [15]:
from statsmodels.stats.weightstats import _tconfint_generic

In [36]:
mort_mean_std = water_data['mortality'].std() / np.sqrt(water_data['mortality'].shape[0])
print('Mortality 95%% interval: %s' %  str(_tconfint_generic(mort_mean, mort_mean_std, water_data['mortality'].shape[0] - 1,
                                                         0.05, 'two-sided')))


Mortality 95% interval: (1476.0833413552848, 1572.2117406119285)

На данных из предыдущего вопроса постройте 95% доверительный интервал для средней годовой смертности по всем южным городам. Чему равна его верхняя граница? Округлите ответ до 4 знаков после десятичной точки.


In [48]:
water_data_south = water_data[water_data.location == 'South']
mort_mean_south = water_data_south['mortality'].mean()
print('Mean south mortality: %f' % mort_mean_south)


Mean south mortality: 1376.807692

In [49]:
mort_mean_south_std = water_data_south['mortality'].std() / np.sqrt(water_data_south['mortality'].shape[0])
print('Mortality south 95%% interval: %s' %  str(_tconfint_generic(mort_mean_south, mort_mean_south_std,
                                                                   water_data_south['mortality'].shape[0] - 1,
                                                                   0.05, 'two-sided')))


Mortality south 95% interval: (1320.1517462936238, 1433.463638321761)

На тех же данных постройте 95% доверительный интервал для средней годовой смертности по всем северным городам. Пересекается ли этот интервал с предыдущим? Как вы думаете, какой из этого можно сделать вывод?


In [50]:
water_data_north = water_data[water_data.location == 'North']
mort_mean_north = water_data_north['mortality'].mean()
print('Mean north mortality: %f' % mort_mean_north)


Mean north mortality: 1633.600000

In [51]:
mort_mean_north_std = water_data_north['mortality'].std() / np.sqrt(water_data_north['mortality'].shape[0])
print('Mortality north 95%% interval: %s' %  str(_tconfint_generic(mort_mean_north, mort_mean_north_std,
                                                                   water_data_north['mortality'].shape[0] - 1,
                                                                   0.05, 'two-sided')))


Mortality north 95% interval: (1586.5605251961385, 1680.6394748038613)

Пересекаются ли 95% доверительные интервалы для средней жёсткости воды в северных и южных городах?


In [52]:
hardness_mean_south = water_data_south['hardness'].mean()
print('Mean south hardness: %f' % hardness_mean_south)

hardness_mean_north = water_data_north['hardness'].mean()
print('Mean north hardness: %f' % hardness_mean_north)


Mean south hardness: 69.769231
Mean north hardness: 30.400000

In [53]:
hardness_mean_south_std = water_data_south['hardness'].std() / np.sqrt(water_data_south['hardness'].shape[0])
print('Hardness south 95%% interval: %s' %  str(_tconfint_generic(hardness_mean_south, hardness_mean_south_std,
                                                                   water_data_south['hardness'].shape[0] - 1,
                                                                   0.05, 'two-sided')))

hardness_mean_north_std = water_data_north['hardness'].std() / np.sqrt(water_data_north['hardness'].shape[0])
print('Hardness north 95%% interval: %s' %  str(_tconfint_generic(hardness_mean_north, hardness_mean_north_std,
                                                                   water_data_north['hardness'].shape[0] - 1,
                                                                   0.05, 'two-sided')))


Hardness south 95% interval: (53.467198692036106, 86.071262846425441)
Hardness north 95% interval: (21.422487285724259, 39.377512714275738)

Вспомним формулу доверительного интервала для среднего нормально распределённой случайной величины с дисперсией σ2: При σ=1 какой нужен объём выборки, чтобы на уровне доверия 95% оценить среднее с точностью ±0.1?


In [56]:
from scipy import stats
np.ceil((stats.norm.ppf(1-0.05/2) / 0.1)**2)


Out[56]:
385.0